package com.jt.aop;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.vo.SysResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

//标识改类是全局异常处理机制的配置类
@Slf4j //添加日志
@RestControllerAdvice //advice通知   返回的数据都是json串
public class SystemExceptionAOP {

    /*
     * 添加通用异常返回的方法.
     * 底层原理:AOP的异常通知.
     *
     *如果跨域访问发生了异常，则返回值结果必须经过特殊的格式封装才行，如果是跨域访问形式，全局异常处理 可以正确的返回结果
     * 思路1：判断用户提交参数中是否有callback参数
     * callback(json)
     */

    @ExceptionHandler({RuntimeException.class}) //拦截运行时异常
    public Object systemResultException(Exception e, HttpServletRequest request){
        //1.获取用户的请求参数
        String callback = request.getParameter("callback");

        //2.判断参数是否有值
        if(StringUtils.isEmpty(callback)){
            //用户请求不是jsonp跨域访问形式\
            //打印异常信息
            e.printStackTrace();
            return SysResult.fail();
        }else {
            //jsonp的报错信息
            e.printStackTrace();
            return new JSONPObject(callback,SysResult.fail());
        }
    }

}
